package com.xxl.job.admin.core.conf;

import com.xxl.job.admin.core.alarm.JobAlarmer;
import com.xxl.job.admin.core.scheduler.XxlJobScheduler;
import com.xxl.job.admin.dao.*;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import javax.sql.DataSource;
import java.util.Arrays;

/**
 * xxl-job config
 *
 * @author xuxueli 2017-04-28
 */

@Component
public class XxlJobAdminConfig implements InitializingBean, DisposableBean {

  private static XxlJobAdminConfig adminConfig = null;

  public static XxlJobAdminConfig getAdminConfig() {
    return adminConfig;
  }

  // ---------------------- XxlJobScheduler ----------------------

  private XxlJobScheduler xxlJobScheduler;

  @Override
  public void afterPropertiesSet() throws Exception {
    adminConfig = this;

    xxlJobScheduler = new XxlJobScheduler();
    xxlJobScheduler.init();
  }

  @Override
  public void destroy() throws Exception {
    xxlJobScheduler.destroy();
  }

  // ---------------------- XxlJobScheduler ----------------------

  // conf
  @Value("${xxl.job.i18n}")
  private String i18n;

  @Value("${xxl.job.accessToken}")
  private String accessToken;

  @Value("${spring.mail.from}")
  private String emailFrom;

  @Value("${xxl.job.triggerpool.fast.max}")
  private int triggerPoolFastMax;

  @Value("${xxl.job.triggerpool.slow.max}")
  private int triggerPoolSlowMax;

  @Value("${xxl.job.logretentiondays}")
  private int logretentiondays;

  // dao, service

  @Resource
  private XxlJobLogDao xxlJobLogDao;
  @Resource
  private XxlJobInfoDao xxlJobInfoDao;
  @Resource
  private XxlJobRegistryDao xxlJobRegistryDao;
  @Resource
  private XxlJobGroupDao xxlJobGroupDao;
  @Resource
  private XxlJobLogReportDao xxlJobLogReportDao;
  @Resource
  private JavaMailSender mailSender;
  @Resource
  private DataSource dataSource;
  @Resource
  private JobAlarmer jobAlarmer;


  public String getI18n() {
    if (!Arrays.asList("zh_CN", "zh_TC", "en").contains(i18n)) {
      return "zh_CN";
    }
    return i18n;
  }

  public String getAccessToken() {
    return accessToken;
  }

  public String getEmailFrom() {
    return emailFrom;
  }

  public int getTriggerPoolFastMax() {
    if (triggerPoolFastMax < 200) {
      return 200;
    }
    return triggerPoolFastMax;
  }

  public int getTriggerPoolSlowMax() {
    if (triggerPoolSlowMax < 100) {
      return 100;
    }
    return triggerPoolSlowMax;
  }

  public int getLogretentiondays() {
    if (logretentiondays < 7) {
      return -1;  // Limit greater than or equal to 7, otherwise close
    }
    return logretentiondays;
  }

  public XxlJobLogDao getXxlJobLogDao() {
    return xxlJobLogDao;
  }

  public XxlJobInfoDao getXxlJobInfoDao() {
    return xxlJobInfoDao;
  }

  public XxlJobRegistryDao getXxlJobRegistryDao() {
    return xxlJobRegistryDao;
  }

  public XxlJobGroupDao getXxlJobGroupDao() {
    return xxlJobGroupDao;
  }

  public XxlJobLogReportDao getXxlJobLogReportDao() {
    return xxlJobLogReportDao;
  }

  public JavaMailSender getMailSender() {
    return mailSender;
  }

  public DataSource getDataSource() {
    return dataSource;
  }

  public JobAlarmer getJobAlarmer() {
    return jobAlarmer;
  }

}
